package com.example.demo.dao;


import com.example.demo.domain.base.BaseEntity;
import com.example.demo.vo.PageRequest;
import com.example.demo.vo.PageResult;
import org.hibernate.criterion.Criterion;

import java.util.Collection;
import java.util.List;

/**
 * @author Jack
 * @Title: 基础Dao服务
 * @Description: 基础Dao服务
 * @date 2018年1月7日14:09:16
 */
public interface BaseDao {

    /**
     * 保存实体
     *
     * @param entity 实体对象
     * @reEurn 实体主键
     */
    <E extends BaseEntity> void save(E entity);

    /**
     * 更新实体
     *
     * @param entity 实体对象
     * @reEurn 实体主键
     */
    <E extends BaseEntity> void update(E entity);

    /**
     * @param entity 实体类
     * @throws
     * @Title: 新增或修改实体类
     * @Description: 新增或修改实体类
     */
    <E extends BaseEntity> void saveOrUpdate(E entity);

    /**
     * @param c  实体类
     * @param id 实体类Id
     * @throws
     * @Title: 根据ID查找实体类
     * @Description: 根据ID查找实体类
     */
    <E extends BaseEntity> E findById(Class<E> c, Long id);

    /**
     * @param entity 实体类
     * @throws
     * @Title: 合并实体类
     * @Description: 合并实体类
     */
    <E extends BaseEntity> E merge(E entity);


    /**
     * @param entity 实体类
     * @throws
     * @Title: 更新并刷新实体类
     * @Description: 更新并刷新实体类
     */
    <E extends BaseEntity> void updateAndRefresh(E entity);

    /**
     * @param entity 实体类
     * @throws
     * @Title: 刷新实体类
     * @Description: 刷新实体类
     */
    <E extends BaseEntity> void refresh(E entity);

    /**
     * @throws
     * @Title: 清除session缓存
     * @Description: 刷新实体类
     */
    void clear();

    /**
     * @throws
     * @Title:
     * @Description:
     */
    void flush();

    /**
     * @param hql hql语句
     * @param hql 参数
     * @throws
     * @Title: 根据HQl进行更新操作
     * @Description: 根据HQl进行更新操作
     */
    void updateByHQL(String hql, Object... values);

    /**
     * @param entity 实体类
     * @throws
     * @Title: 删除实体类
     * @Description: 删除实体类
     */
    <E extends BaseEntity> void delete(E entity);

    /**
     * @param clazz 实体类Class
     * @param id    实体类Id
     * @throws
     * @Title: 根据ID删除实体类
     * @Description: 根据ID删除实体类
     */
    <E extends BaseEntity> void deleteById(Class<E> clazz, long id);

    /**
     * @param clazz 实体类Class
     * @param ids   实体类Id集合
     * @throws
     * @Title: 根据ID删除实体类
     * @Description: 根据ID删除实体类
     */
    <E extends BaseEntity> void deleteByIds(Class<E> clazz, Long[] ids);

    /**
     * @param clazz 实体类Class
     * @throws
     * @Title: 删除该实体所有记录
     * @Description: 删除该实体所有记录
     */
    <E extends BaseEntity> int deleteAll(Class<E> clazz);

    /**
     * @param sql hql语句
     * @throws
     * @Title: 执行删除hql语句
     * @Description: 执行删除hql语句
     */
    void deleteBySQL(final String sql);

    /**
     * @param criterion 条件
     * @throws
     * @Title: 按照条件进行删除
     * @Description: 按照条件进行删除
     */
    <E extends BaseEntity> void deleteByRestrictions(Class<E> clazz, Criterion... criterion);

    /**
     * @param collection 实体类集和
     * @throws
     * @Title: 将实体集合里的实体删除
     * @Description: 将实体集合里的实体删除
     */
    <E extends BaseEntity> void deleteAll(Collection<E> collection);


    /**
     * @throws
     * @Title: 查找满足条件的记录有多少条
     * @Description: 查找满足条件的记录有多少条
     */
    <E extends BaseEntity> Integer getCountByRestrictions(Class<E> clazz, Criterion... criterion);


    /**
     * @throws
     * @Title: 按照条件进行检索
     * @Description: 按照条件进行检索
     */
    <E extends BaseEntity> List<E> findByRestrictions(Class<E> clazz, Criterion... criterion);

    /**
     * @throws
     * @Title: 按照条件进行唯一检索
     * @Description: 按照条件进行唯一检索
     */
    <E extends BaseEntity> E findUniqueByRestrictions(Class<E> clazz, Criterion... criterion);

    /**
     * @throws
     * @Title: 按照条件进行唯一检索
     * @Description: 按照条件进行唯一检索
     */
    <E extends BaseEntity> E findUniqueByRestrictions(Class<E> clazz, boolean isCacheAble, Criterion... criterion);

    /**
     * @throws
     * @Title: 按照ID集合进行查询
     * @Description: 按照ID集合进行查询
     */
    <E extends BaseEntity> List<E> findByIds(Class<E> clazz, Long[] ids);

    /**
     * @throws
     * @Title: 按照条件分页查询
     * @Description: 按照条件分页查询
     */
    <E extends BaseEntity> PageResult<E> getPage(Class<E> clazz, PageRequest pageRequest, Criterion... criterion);


}
